package com.ruoyi.common.utils.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import javax.servlet.ServletRequest;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 通用http工具封装
 *
 * @author ruoyi
 */
public class HttpHelper {
    private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);

    /**
     * 从ServletRequest中获取请求体的字符串内容
     * 用于读取HTTP请求中的body部分（如POST请求的JSON参数、表单数据等）
     *
     * @param request ServletRequest对象，包含客户端发送的请求信息
     * @return 请求体内容的字符串形式，若读取失败则返回空字符串
     */
    public static String getBodyString(ServletRequest request) {
        // 用于拼接请求体内容的字符串构建器
        StringBuilder sb = new StringBuilder();
        // 字符缓冲读取器，用于读取输入流中的字符
        BufferedReader reader = null;
        try (
                // 获取请求的输入流，try-with-resources语法自动关闭资源
                InputStream inputStream = request.getInputStream()
        ) {
            // 创建 BufferedReader，指定UTF-8编码防止中文乱码
            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            // 临时变量，用于存储每行读取的内容
            String line = "";
            // 循环读取输入流中的每一行，直到结束（null表示读取完毕）
            while ((line = reader.readLine()) != null) {
                // 将读取到的每行内容追加到字符串构建器
                sb.append(line);
            }
        } catch (IOException e) {
            // 读取过程中发生IO异常时，记录警告日志
            LOGGER.warn("getBodyString出现问题！");
        } finally {
            // 确保BufferedReader被正确关闭（虽然try-with-resources已处理inputStream，但reader需要手动处理）
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    // 关闭reader时发生异常，记录错误日志
                    LOGGER.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        // 返回拼接好的请求体字符串
        return sb.toString();
    }
}
